package com.example.a_base

import okhttp3.Request
import scala.util.Success
import java.lang.Integer.parseInt

/**
@author whd
@date 2023/10/21 11:40:29
 */
//控制流：if、when、for、while
class e_kongzhiliu {
  //if表达式
  // 在 Kotlin 中，if是一个表达式，即它会返回一个值。 因此就不需要三元运算符（条件 ? 然后 : 否则），因为普通的 if 就能胜任这个角色。
  /*val max = if (a > b) {
    print("Choose a")
    a
} else {
    print("Choose b")
    b
}*/
  //when表达式  when 表达式取代了类 C 语言的 switch 语句。其最简单的形式如下：
  fun aa(x:Int): Unit {
    when (x) {
      1 -> print("x == 1")
      2 -> print("x == 2")
      else -> { // 注意这个块
        print("x is neither 1 nor 2")
      }
    }
  }
  /*when 将它的参数与所有的分支条件顺序比较，直到某个分支满足条件。
  when 既可以被当做表达式使用也可以被当做语句使用。如果它被当做表达式，
  符合条件的分支的值就是整个表达式的值，如果当做语句使用， 则忽略个别分支的值。
  （像 if 一样，每一个分支可以是一个代码块，它的值是块中最后的表达式的值。）*/
  //如果很多分支需要用相同的方式处理，则可以把多个分支条件放在一起，用逗号分隔：
  fun bb(): Unit {
    when (x) {
      0, 1 -> print("x == 0 or x == 1")
      else -> print("otherwise")
    }
  }
  //我们可以用任意表达式（而不只是常量）作为分支条件
  fun cc(x:Int): Unit {
    var s ="3"
    when (x) {
      parseInt(s) -> print("s encodes x")
      else -> print("s does not encode x")
    }
  }
}
//我们也可以检测一个值在（in）或者不在（!in）一个区间或者集合中：
fun dd(x:Int): Unit {
  var validNumbers = listOf<Int>(21,22)
  when (x) {
    in 1..10 -> print("x is in the range")
    in validNumbers -> print("x is valid")
    !in 10..20 -> print("x is outside the range")
    else -> print("none of the above")
  }
}
//另一种可能性是检测一个值是（is）或者不是（!is）一个特定类型的值。注意： 由于智能转换，你可以访问该类型的方法与属性而无需任何额外的检测
  fun hasPrefix(x: Any) = when(x) {
    is String -> x.startsWith("prefix")
    else -> false
  }
//when 也可以用来取代 if-else if链。 如果不提供参数，所有的分支条件都是简单的布尔表达式，而当一个分支的条件为真时则执行该分支：
fun ee(x:Int,y:Int): Unit {
  when {
    x%2==0 -> print("x is odd")
    y%2==1 -> print("y is even")
    else -> print("x+y is odd.")
  }
  //如果你想要通过索引遍历一个数组或者一个 list，你可以这么做：
  fun(array: List<Int>): Unit {
    for (i in array.indices) {
      println(array[i])
    }
  }
  //或者你可以用库函数 withIndex
  fun(array: List<Int>): Unit {
    for ((index, value) in array.withIndex()) {
      println("the element at $index is $value")
    }
  }
}
//自 Kotlin 1.3 起，可以使用以下语法将 when 的主语（subject，译注：指 when 所判断的表达式）捕获到变量中：
/*fun Request.getBody() =
  when (val response = executeRequest()) {
    is Success -> response.body
    is HttpError -> throw HttpException(response.status)
  }*/

/*For 循环*
用法与Java相似，只是语法有不同
/
 */
/*
for (item: Int in ints) {
    // ……
}
*/
/*while循环，和Java中的一模一样
* 照常使用*/

fun main() {
  //这里for循环提供了步数，还可以反向操作
  for (i in 1..3) {
    println(i)
  }
  for (i in 6 downTo 0 step 2) {
    println(i)
  }
}
